Link National Oil Company Database

library(readr)
library(tidyverse)
library(ggplot2)
library(plotly)
library(lubridate)
options (scipen = 999)
  
#cargo la base
nocs_full <- read_csv( "../data/nocs/NRGI-NOCdatabase-FullDataset.csv") %>% 
   mutate(observation = as.double(observation),
          anio = (as.Date(parse_date_time(year, orders  = "%Y"))))

hidrocarburos_df <- read_csv("../data/balances/hidrocarburos_df.csv") %>% 
  select(-"...1")  
 
  
  

Variables que contiene la base

variables = unique(nocs_full$indicatorName)
variables
 [1] "Any shares publicly traded?"                                                      
 [2] "Auditor opinion issued with qualification?"                                       
 [3] "Bonus payments"                                                                   
 [4] "Capex (company-wide) per barrel"                                                  
 [5] "Capex / total revenue"                                                            
 [6] "Capital expenditures"                                                             
 [7] "Cash and cash equivalents"                                                        
 [8] "Cash flows from financing activities"                                             
 [9] "Cash flows from investing activities"                                             
[10] "Cash flows from operating activities"                                             
[11] "Cash ratio"                                                                       
[12] "Country released EITI report for this year?"                                      
[13] "Current assets"                                                                   
[14] "Current liabilities"                                                              
[15] "Dividends"                                                                        
[16] "Domestic oil, gas & product sales"                                                
[17] "Domestic sales"                                                                   
[18] "Employees"                                                                        
[19] "Equity"                                                                           
[20] "Exchange rate"                                                                    
[21] "Exploration - Seismic (2D)"                                                       
[22] "Exploration - Seismic (3D and 4D)"                                                
[23] "External oil, gas & product sales"                                                
[24] "External sales"                                                                   
[25] "Fiscal payments from contractors"                                                 
[26] "Gas production"                                                                   
[27] "Gas production of home country"                                                   
[28] "GDP"                                                                              
[29] "General government revenue"                                                       
[30] "General government total expenditure"                                             
[31] "Government gross debt"                                                            
[32] "Government resource revenue / general government revenue"                         
[33] "Government transfers"                                                             
[34] "Income tax"                                                                       
[35] "Longterm/fixed assets"                                                            
[36] "National gas reserves"                                                            
[37] "National oil and gas reserves"                                                    
[38] "National oil reserves"                                                            
[39] "Natural capital, subsoil assets: oil & gas"                                       
[40] "Net income after taxes"                                                           
[41] "Net income after taxes/equity"                                                    
[42] "Net income after taxes/revenue"                                                   
[43] "Net income after taxes / total assets"                                            
[44] "Net income from all revenues (before transfers to govt.)"                         
[45] "Net income from core revenues (before transfers to govt.)"                        
[46] "Net income per employee"                                                          
[47] "Net income / total revenue (before transfers to govt.)"                           
[48] "NOC debt / government gross debt"                                                 
[49] "NOC has stake in fields abroad?"                                                  
[50] "NOC net income / general government revenue"                                      
[51] "NOC oil and gas production / oil and gas production of home country"              
[52] "NOC operator of any production?"                                                  
[53] "NOC operator of fields abroad?"                                                   
[54] "NOC reserves / national oil and gas reserves"                                     
[55] "NOC total assets / total national wealth"                                         
[56] "NOC total revenues / GDP"                                                         
[57] "NOC total revenues / general government revenues"                                 
[58] "NOC transfers to government / general government revenue"                         
[59] "NOC transfers to government / NOC net income"                                     
[60] "NOC transfers to government / total NOC revenues"                                 
[61] "NOC transfers to government / total public expenditures"                          
[62] "O&G production / total reserves"                                                  
[63] "O&G revenue per barrel of production"                                             
[64] "O&G revenue per barrel of reserves"                                               
[65] "O&G revenue per employee"                                                         
[66] "Oil and gas production of home country"                                           
[67] "Oil & gas production"                                                             
[68] "Oil, gas & product sales"                                                         
[69] "Oil production"                                                                   
[70] "Oil production of home country"                                                   
[71] "Operational expenditures"                                                         
[72] "Opex (company-wide) per barrel"                                                   
[73] "Opex / total revenue"                                                             
[74] "Other transfers to government"                                                    
[75] "Percentage non-core activities in total revenue"                                  
[76] "Proceeds of state profit/equity petroleum"                                        
[77] "Production on which NOC is operator"                                              
[78] "Production per employee"                                                          
[79] "Report audited by independent external auditor?"                                  
[80] "Report presented according to International Financial Reporting Standards (IFRS)?"
[81] "Reserves"                                                                         
[82] "Reserves per employee"                                                            
[83] "Reserves / production ratio"                                                      
[84] "Return on capital employed (before transfers to govt.)"                           
[85] "Revenue - Non core activities"                                                    
[86] "Rigs"                                                                             
[87] "Royalties"                                                                        
[88] "Total assets"                                                                     
[89] "Total liabilities"                                                                
[90] "Total longterm/fixed liabilities"                                                 
[91] "Total national wealth"                                                            
[92] "Total revenue"                                                                    
[93] "Total revenue per barrel of production"                                           
[94] "Total revenue per employee"                                                       
[95] "Total transfers to government"                                                    
[96] "Transfers to government per barrel"                                               
[97] "Wells drilled"                                                                    

Lista de todas las empresas

#empresas disponibles
unique(nocs_full$company)

Cantidad de empresas

length(unique(nocs_full$company))
#filtro exploratorio de empresas 
filtro_empresas <- c("YPF", "Petrobras", "YPFB", "PDVSA", "Saudi Aramco")
#filtro con empresas de América Latina
empresas_AL <- nocs_full %>% 
  filter(region ==  "Latin America/Caribbean") %>% 
  select(company, country) 
empresas_AL <- empresas_AL[!duplicated(empresas_AL), ]

empresas_AL
NA

Producción

production_graf <-  nocs_full %>% 
  filter(indicatorName %in% c("Oil production", "Gas production")) %>% 
  mutate(observation = observation / 1000000,
         id = 1:nrow(.)) %>%
  group_by(company, indicatorName, year, region ) %>% 
  mutate(observation = sum(observation, na.rm = T)) %>% 
  ggplot(aes(year, observation , color = company))+
  geom_point(size = 0.8, alpha = 0.9, aes(shape = country))+
  labs(title =  "Oil & gas production",
       x = "Año", y = "Millons de barriles de petróleo equivalente/día")+
  theme(legend.position = "none",
        axis.text.x = element_text(angle = 90, hjust = 1))+
  facet_grid(indicatorName~region, labeller = label_wrap_gen(width=17))
ggplotly(production_graf)

Activo y Patrimonio Neto

assets_graf <-  nocs_full %>% 
  filter(indicatorName %in% c( "Total assets"),
         year == 2017, units == "USD million",
         !is.na(observation)) %>%
  ggplot(aes(x = reorder(company,-observation) , y= observation, fill = company))+
  geom_col(position = "stack")+
  labs(title =  "Total assets",
       x = "Empresa", y = "MM USD")+
  theme(legend.position = "none",
        axis.text.x = element_text(angle = 90, hjust = 1))
  # facet_grid(indicatorName~region, labeller = label_wrap_gen(width=17))
ggplotly(assets_graf)
assets_graf <-  nocs_full %>% 
  filter(indicatorName %in% c( "Equity"),
         year == 2017, units == "USD million",
         !is.na(observation)) %>%
  ggplot(aes(x = reorder(company,-observation) , y= observation, fill = company))+
  geom_col(position = "stack")+
  labs(title =  "Total Equity", subtitle= "Year 2017",
       x = "Empresa", y = "MM USD")+
  theme(legend.position = "none",
        axis.text.x = element_text(angle = 90, hjust = 1))
  # facet_grid(indicatorName~region, labeller = label_wrap_gen(width=17))
ggplotly(assets_graf)

Inversión en capital

capex_graf <-  nocs_full %>% 
  filter(indicatorName %in% c("Capital expenditures"), units == "USD million") %>%
  ggplot(aes(x = year, y= observation, color = company))+
  geom_line(aes(linetype = country))+
  labs(title =  "Capital expenditures (CAPEX)",
       x = "Año", y = "MM USD")+
  theme(legend.position = "none",
        axis.text.x = element_text(angle = 90, hjust = 1),
        strip.text.y = element_text(size = 7))+
  facet_grid(~region, labeller = label_wrap_gen(width=15))

ggplotly(capex_graf)

Rentabilidad

Data Frame con indicadores


#para cálculo de rentabilidad
nocs_df <- nocs_full %>%
  select(year, company, region, country, productionGroup, indicatorName, units, observation) %>% 
  filter(indicatorName %in% c("Longterm/fixed assets", "Cash and cash equivalents",
                               "Net income after taxes", "Income tax",
                              "Equity","Total assets", 
                              "Total liabilities" , "Current liabilities" ),
         units == "USD million") %>%
  mutate(row_id = 1:nrow(.)
         # , observation = as.double(observation)
         ) %>%
  spread(.,
         key = indicatorName,
         value = observation) %>% 
  select(-c(row_id)) %>% 
  rename( fixed_assets = "Longterm/fixed assets", cash_and_equi = "Cash and cash equivalents",
         net_income_after_tax = "Net income after taxes" , income_tax = "Income tax",
         equity = "Equity",  assets = "Total assets",
         liabilities = "Total liabilities", current_liabilities = "Current liabilities") %>% 
  mutate(net_income_after_tax = as.double(net_income_after_tax),
         fixed_assets = as.double(fixed_assets),
         cash_and_equi = as.double(cash_and_equi),
         income_tax = as.double(income_tax),
         equity = as.double(equity),
         liabilities = as.double(liabilities),
         year = parse_date_time(year, orders = "y")) %>% 
  group_by(year, company, country, region, productionGroup, units) %>%
  summarise(fixed_assets = sum(fixed_assets, na.rm = T),
            cash_and_equi = sum(cash_and_equi, na.rm = T),
            net_income_after_tax = sum(net_income_after_tax, na.rm = T),
            income_tax = sum(income_tax, na.rm =  T),
            assets = sum(assets, na.rm =  T),
            liabilities = sum(liabilities, na.rm =  T),
            current_liabilities = sum(current_liabilities, na.rm =  T),
            equity = sum(equity, na.rm =  T),
            KTA = cash_and_equi + fixed_assets,
            tg_beforetax = (income_tax + net_income_after_tax) / KTA,
            tg_aftertax = net_income_after_tax / KTA,
            ratio_endeudamiento = liabilities / equity, 
            ratio_endeudamiento_cp = current_liabilities/equity,
            pasivo_activo = liabilities/assets,
            ratio_solvencia =  equity /liabilities) 

# nocs_df %>% arrange(-tg_aftertax) %>% 
#   select(company, KTA, tg_aftertax)

nocs_df

nocs_df[sapply(nocs_df, is.infinite)] <- NA

Rentabilidad media de la rama

tg_media <- nocs_df %>%
    group_by(year) %>% 
    summarise(
                  tg_media_before_tax = sum(income_tax, net_income_after_tax, na.rm =  T)/ 
                                                        sum(fixed_assets, cash_and_equi, na.rm = T),
                  tg_media_after_tax = sum(net_income_after_tax, na.rm =  T) / 
                                                        sum(fixed_assets, cash_and_equi, na.rm = T)) %>% 
                  # tg_media_before_tax_mean = sum(mean(income_tax, na.rm =  T), 
                  #                                mean(net_income_after_tax, na.rm = T), na.rm = T)/ 
                  #                             sum(mean(fixed_assets, na.rm = T), 
                  #                                 mean(cash_and_equi, na.rm = T), na.rm = T),
                  # tg_media_after_tax_mean = mean(net_income_after_tax, na.rm = T)/ 
                  #                             sum(mean(fixed_assets, na.rm = T), 
                  #                                 mean(cash_and_equi, na.rm = T), na.rm = T)) %>% 
     gather(.,
               key = variable,
               value = valor, 
               2:3) 
    # mutate(metodo = case_when( str_sub(variable[-3])))
                

tg_media_graf <- tg_media %>% 
  # filter(variable == "tg_media_before_tax_mean") %>% 
  ggplot(aes(year, valor, color = variable))+
  geom_line()+
  labs(title =  "NOC's. Tasa de Ganancia media")+
  theme(legend.position = "bottom")+
  scale_y_continuous(labels = scales::percent)
tg_media_graf
     
nocs_df_con_media <- nocs_df %>% 
  bind_rows(tg_media %>% 
              spread(key = variable,
                     value = valor) %>% 
              mutate(company = "TG Media") %>% 
              rename(tg_beforetax = tg_media_before_tax,
                     tg_aftertax = tg_media_after_tax)) %>% 
  mutate(is_media = case_when(company == "TG Media" ~ "media",
                              TRUE ~ "empresas"))

write.csv(nocs_df_con_media, file = "../resultados/comparacion_paises/nocs_df_con_media.csv")

graf_media_line <- nocs_df_con_media %>% 
  ggplot(aes(year, tg_aftertax, color = company, group = is_media))+
  geom_line()+
  geom_point()+
  labs(title =  "NOC's. Rentabilidad media y del resto de las empresas después de impuestos")+
  theme(legend.position = "none")+
  scale_y_continuous(labels = scales::percent, limits = c(-0.30, 0.70),breaks = seq(-0.30, 0.70, .1))
graf_media_line
graf_media_box <- nocs_df %>% 
  # ggplot(aes(year, tg_aftertax, color = company, size = is_media))+
  ggplot(aes(year, tg_aftertax, color = company, group = year))+
  geom_boxplot()+
  # ggplot(aes(data = nocs_df_con_media %>% filter(company == "TG Media"), year, tg_aftertax))+
  # geom_line()+
  labs(title =  "NOC's. Rentabilidad despues de impuestos")+
  theme(legend.position = "none")+
  scale_y_continuous(labels = scales::percent, limits = c(-0.3, .8), breaks = seq(-0.3, .8, 0.1))
graf_media_box
summary(nocs_df %>% 
  group_by(year, productionGroup) %>% 
  summarise(tg_aftertax = mean(tg_aftertax, na.rm = T)) %>% 
  spread(.,
         key = productionGroup,
         value =  tg_aftertax))

Rentabilidad según tamaño

tg_graf_prod_group <- nocs_df %>% 
  # filter(tg_aftertax != 0 & fixed_assets > 0 & tg_aftertax < 5 & tg_aftertax > -20 ) %>%  
  ggplot(aes(year, tg_aftertax, color = company))+
  geom_line()+
  labs(title =  "NOC's. Rentabilidad despues de impuestos. División por tamaño")+
  theme(legend.position = "none",
        axis.text.x = element_text(angle = 90, hjust = 1))+
  scale_y_continuous(labels = scales::percent, limits = c(-0.3, .8), breaks = seq(-0.3, .8, 0.20))+
  facet_grid(~productionGroup,  labeller = label_wrap_gen(width=17))
plotly::ggplotly(tg_graf_prod_group)

Rentabilidad según región

tg_graf_xregion <- nocs_df %>% 
  filter(tg_aftertax != 0 & fixed_assets > 0 & tg_aftertax < 1 & tg_aftertax > -20 ) %>%
  ggplot(aes(year, tg_aftertax, color = company))+
  geom_line()+
  labs(title =  "NOC's. Rentabilidad despues de impuestos. División por regións")+
  theme(legend.position = "none",
        axis.text.x = element_text(angle = 90, hjust = 1))+
  scale_y_continuous(labels = scales::percent)+
  facet_grid(~region,  labeller = label_wrap_gen(width=17))

plotly::ggplotly(tg_graf_xregion)

YPF, Petrobras y empresas seleccionadas

filtro_emp_df <-  nocs_df  %>%
  ungroup() %>% 
  mutate(company = case_when(!(company %in% filtro_empresas) ~ "Media (resto de empresas)",
                             T ~ company)) %>% 
  group_by(year, company) %>%
  summarise(fixed_assets = sum(fixed_assets, na.rm = T),
            cash_and_equi = sum(cash_and_equi, na.rm = T),
            net_income_after_tax = sum(net_income_after_tax, na.rm = T),
            income_tax = sum(income_tax, na.rm =  T),
            liabilities = sum(liabilities, na.rm =  T),
            equity = sum(equity, na.rm =  T),
            KTA = cash_and_equi + fixed_assets,
            tg_beforetax = (income_tax + net_income_after_tax) / KTA,
            tg_aftertax = net_income_after_tax / KTA,
            ratio_endeudamiento = liabilities / equity, 
            ratio_solvencia =  equity /liabilities)
filtro_emp_df


tg_filtro_graf <- filtro_emp_df %>% 
  filter(tg_aftertax != 0 & fixed_assets > 0 & tg_aftertax < 5 & tg_aftertax > -20 ) %>%  
  ggplot(aes(year, tg_aftertax, color = company))+
  geom_line()+
  labs(title =  "Rentabilidad",
       subtitle =  "Empresas seleccionadas")+
  # theme(legend.position = "none")+
  # facet_wrap(~productionGroup)+
  scale_y_continuous(labels = scales::percent)

  
ggplotly(tg_filtro_graf)
tg_graf_ypf <- nocs_df %>%  
  mutate(is_ypf = case_when(company == "YPF" ~ "YPF" ,
                            TRUE ~ "Other")) %>% 
  filter(tg_aftertax != 0 & fixed_assets > 0 & tg_aftertax < 1 & tg_aftertax > -20 ) %>%
  ggplot(aes(year, tg_aftertax, color = is_ypf))+
  # ggplot(aes(year, tg_aftertax, color = company, size = is_ypf))+
  geom_point(alpha = 0.6)+
  stat_smooth(level = 0.30)+
  labs(title =  "NOC's. Rentabilidad de YPF vs resto de las empresas")+
  theme(legend.position = "none")+
  scale_y_continuous(labels = scales::percent, limits = c(-0.35, 0.75))

ggplotly(tg_graf_ypf)
# ruta_graf_tg <- "tg_filtro_graf.png"
# png(ruta_graf_tg)
# print(tg_filtro_graf)
# dev.off()

Analisis de correlación

#Correlación entre KTA y ganancias después de impuestos
cor(x = nocs_df$KTA, 
    y = nocs_df$net_income_after_tax, use = "complete.obs",
    method = "spearman")
#Correlación entre CAPEX y ganancias después de impuestos
nocs_spread <- nocs_full %>% 
  select(year, company, region, country, productionGroup, indicatorName, units, observation) %>% 
  filter(units == "USD million") %>% 
  mutate(row_id = 1:nrow(.)) %>%
  spread(.,
         key = indicatorName,
         value =  observation)
 
nocs_spread_2 <- nocs_full %>%
  select(year, company, region, country, productionGroup, indicatorName, units, observation) %>% 
  filter(indicatorName %in% c("Operational expenditures", "Total revenue", 
                              "Capital expenditures", "Net income after taxes"),
         units == "USD million") %>%
  mutate(row_id = 1:nrow(.)) %>%
  spread(.,
         key = indicatorName,
         value = observation) %>%
  rename(capex = 'Capital expenditures',
         net_income = "Net income after taxes") %>% 
  group_by(company, year) %>% 
  summarise(capex = sum(capex, na.rm = T),
            net_income = sum(net_income, na.rm = T))



cor(x = nocs_spread_2$capex, 
    y = nocs_spread_2$net_income, use = "complete.obs",
    method = "spearman")

Endeudamiento

Solvencia

\[ Solvencia = \frac{Patrimonio Neto}{Pasivo}\]

solvencia_graf <- nocs_df %>% 
  filter(ratio_solvencia >=0 & ratio_solvencia < 4) %>% 
  ggplot(aes(year, ratio_solvencia, color = company))+
  geom_point(alpha = 0.5)+
  labs(title =  "Ratio de solvencia todas las empresas")+
  theme(legend.position = "none")+
  # scale_y_continuous(labels = scales::percent)+
  facet_wrap(~productionGroup)
ggplotly(solvencia_graf)
solvencia_graf_2 <- nocs_df %>% 
  # filter(ratio_solvencia >=0 & ratio_solvencia < 4) %>% 
  filter(company %in% empresas_AL$company) %>% 
  ggplot(aes(year, ratio_solvencia, color = company))+
  geom_point(alpha = 0.5)+
  labs(title =  "Ratio de solvencia de empresas de AL")+
  theme(legend.position = "none")+
  # scale_y_continuous(labels = scales::percent)+
  facet_wrap(~productionGroup)

ggplotly(solvencia_graf_2)
solvencia_filtro_graf <- filtro_emp_df %>% 
  # filter(ratio_solvencia >=0 & ratio_solvencia < 4) %>% 
  ggplot(aes(year, ratio_solvencia, color = company))+
  geom_line()+
  geom_point(alpha = 1, size = 3)+
  labs(title =  "Ratio de solvencia empresas seleccionadas")+
  theme(legend.position="bottom")
  # scale_y_continuous(labels = scales::percent)+

solvencia_filtro_graf

Endeudamiento

Ratio de endeudamiento

\[ Endeudamiento = \frac{Pasivo}{Patrimonio Neto} \]


nocs_df %>% 
  ggplot(aes(year, pasivo_activo ,group = year))+
  geom_boxplot() +
  # geom_point(aes(color = company))+
  # geom_line(aes(group = company))+
  geom_line(data = nocs_df %>% filter(company == "YPF"), 
            aes(year, pasivo_activo,color = "red", group = company), size = 1)+
  theme(legend.position = "none")+
  labs(title = "Distribución de Pasivo/Activo de NOC's e YPF")
  # ylim(NA, 15 )

ggplot(nocs_df %>% filter(company == "YPF"))+
  geom_line( aes(year, pasivo_activo, group = company))+
  labs(title = "Pasivo/Activo de YPF")
nocs_df %>% 
  ggplot(aes(year, ratio_endeudamiento_cp ,group = year))+
  geom_boxplot() +
  # geom_point(aes(color = company))+
  # geom_line(aes(group = company))+
  geom_line(data = nocs_df %>% filter(company == "YPF"), 
            aes(year, ratio_endeudamiento_cp,color = "red", group = company), size = 1)+
  theme(legend.position = "none")+
  labs(title = "Distribución de ratio de endeudamiento CP de NOC's e YPF")+
  ylim(NA, 12.5 )

ggplot(nocs_df %>% filter(company == "YPF"))+
  geom_line( aes(year, ratio_endeudamiento_cp, group = company))+
  labs(title = "Ratio de endeudamiento CP de YPF")
endeudamiento_graf <- nocs_df %>% 
  filter(ratio_endeudamiento <10 & ratio_endeudamiento > -3 ) %>% 
  ggplot(aes(year, ratio_endeudamiento, color = company))+
  geom_point(alpha = 0.5)+
  labs(title =  "Ratio de endeudamiento todas las empresas")+
  theme(legend.position = "none")+
  # scale_y_continuous(labels = scales::percent)+
  facet_wrap(~productionGroup)
ggplotly(endeudamiento_graf)
endeudamiento_graf_al <- nocs_df %>% 
  filter(ratio_endeudamiento <30 ) %>%
  filter(company %in% empresas_AL$company ) %>% 
  ggplot(aes(year, ratio_endeudamiento, color = company))+
  geom_point(alpha = 0.5)+
  labs(title =  "Ratio de endeudamiento empresas AL")+
  theme(legend.position = "none")+
  # scale_y_continuous(labels = scales::percent)+
  facet_wrap(~productionGroup)
ggplotly(endeudamiento_graf_al)

endeudamiento_filtro_graf <- filtro_emp_df %>% 
  # filter(ratio_solvencia >=0 & ratio_solvencia < 4) %>% 
  ggplot(aes(year, ratio_endeudamiento, color = company))+
  geom_point(alpha = 1, size = 3)+
  geom_line()+
  labs(title =  "Ratio de endeudamiento empresas seleccionadas")+
  theme(legend.position="bottom")
  # scale_y_continuous(labels = scales::percent)+

endeudamiento_filtro_graf

Valores absolutos

endeudamiento_all <- nocs_df %>% 
  # filter(company %in% empresas_AL$company ) %>%
  ggplot(aes(year, liabilities, color = company))+
  geom_point(alpha = 0.5)+
  geom_line()+
  labs(title =  "Liabilities", y = "USD million")+
  theme(legend.position="none")+
  facet_wrap(~productionGroup)
  # scale_y_continuous(labels = scales::percent)+

ggplotly(endeudamiento_all)
endeudamiento_al <- nocs_df %>% 
  filter(company %in% empresas_AL$company ) %>%
  ggplot(aes(year, liabilities, color = company))+
  geom_point(alpha = 0.5)+
  geom_line()+
  labs(title =  "Liabilities", y = "USD million")+
  theme(legend.position="none")+
  facet_wrap(~productionGroup)
  # scale_y_continuous(labels = scales::percent)+

ggplotly(endeudamiento_al)
endeudamiento <- filtro_emp_df %>% 
  filter(company != "Resto") %>%
  ggplot(aes(year, liabilities, color = company))+
  geom_point(alpha = 1, size = 3)+
  geom_line()+
  labs(title =  "Liabilities", y = "USD million")+
  theme(legend.position="bottom")
  # scale_y_continuous(labels = scales::percent)+

endeudamiento
# writexl::write_xlsx(list(nocs_data = nocs_df ,
#                          tg_nocs= tg_media), path =  "/Archivos/repos/hidrocarburos/analisis/resultados/argentina/NOC's.xlsx")

#cluster

data_cluster <- nocs_full %>% 
  filter(year == 2011, units == "USD million" ) %>% 
  select(company, productionGroup, indicatorName, observation) %>% 
  mutate(id = 1:nrow(.)) %>% 
  spread(key = indicatorName, value=observation) %>%
  replace(is.na(.), 0 )
  # na.omit()

# data_cluster_z <- scale(data_cluster[4:ncol(data_cluster)])

library(cluster)
datos_para_cluster = data_cluster[4:ncol(data_cluster)]

cantidad_clusters=2

CL  = kmeans(scale(datos_para_cluster),cantidad_clusters)
datos$kmeans = CL$cluster
LS0tDQp0aXRsZTogIkFuw6FsaXNpcyBkZSBOYXRpb25hbCBPaWwgQ29tcGFueSBEYXRhYmFzZSINCmF1dGhvcjoNCi0gYWZmaWxpYXRpb246IFVOR1MvQ09OSUNFVA0KICBuYW1lOiBNYXRlbyBTdXN0ZXINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazoNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDogeWVzDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IHllcw0KICBwZGZfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCi0tLQ0KDQpbTGluayBOYXRpb25hbCBPaWwgQ29tcGFueSBEYXRhYmFzZV0oaHR0cHM6Ly93d3cubmF0aW9uYWxvaWxjb21wYW55ZGF0YS5vcmcvKQ0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShyZWFkcikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCm9wdGlvbnMgKHNjaXBlbiA9IDk5OSkNCiAgDQojY2FyZ28gbGEgYmFzZQ0Kbm9jc19mdWxsIDwtIHJlYWRfY3N2KCAiLi4vZGF0YS9ub2NzL05SR0ktTk9DZGF0YWJhc2UtRnVsbERhdGFzZXQuY3N2IikgJT4lIA0KICAgbXV0YXRlKG9ic2VydmF0aW9uID0gYXMuZG91YmxlKG9ic2VydmF0aW9uKSwNCiAgICAgICAgICBhbmlvID0gKGFzLkRhdGUocGFyc2VfZGF0ZV90aW1lKHllYXIsIG9yZGVycyAgPSAiJVkiKSkpKQ0KDQpoaWRyb2NhcmJ1cm9zX2RmIDwtIHJlYWRfY3N2KCIuLi9kYXRhL2JhbGFuY2VzL2hpZHJvY2FyYnVyb3NfZGYuY3N2IikgJT4lIA0KICBzZWxlY3QoLSIuLi4xIikgIA0KIA0KICANCiAgDQpgYGANCg0KVmFyaWFibGVzIHF1ZSBjb250aWVuZSBsYSBiYXNlDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KdmFyaWFibGVzID0gdW5pcXVlKG5vY3NfZnVsbCRpbmRpY2F0b3JOYW1lKQ0KdmFyaWFibGVzDQpgYGANCg0KTGlzdGEgZGUgdG9kYXMgbGFzIGVtcHJlc2FzDQpgYGB7cn0NCiNlbXByZXNhcyBkaXNwb25pYmxlcw0KdW5pcXVlKG5vY3NfZnVsbCRjb21wYW55KQ0KYGBgDQoNCkNhbnRpZGFkIGRlIGVtcHJlc2FzDQpgYGB7cn0NCmxlbmd0aCh1bmlxdWUobm9jc19mdWxsJGNvbXBhbnkpKQ0KYGBgDQoNCg0KYGBge3J9DQojZmlsdHJvIGV4cGxvcmF0b3JpbyBkZSBlbXByZXNhcyANCmZpbHRyb19lbXByZXNhcyA8LSBjKCJZUEYiLCAiUGV0cm9icmFzIiwgIllQRkIiLCAiUERWU0EiLCAiU2F1ZGkgQXJhbWNvIikNCmBgYA0KDQoNCmBgYHtyfQ0KI2ZpbHRybyBjb24gZW1wcmVzYXMgZGUgQW3DqXJpY2EgTGF0aW5hDQplbXByZXNhc19BTCA8LSBub2NzX2Z1bGwgJT4lIA0KICBmaWx0ZXIocmVnaW9uID09ICAiTGF0aW4gQW1lcmljYS9DYXJpYmJlYW4iKSAlPiUgDQogIHNlbGVjdChjb21wYW55LCBjb3VudHJ5KSANCmVtcHJlc2FzX0FMIDwtIGVtcHJlc2FzX0FMWyFkdXBsaWNhdGVkKGVtcHJlc2FzX0FMKSwgXQ0KDQplbXByZXNhc19BTA0KDQpgYGANCg0KIyBQcm9kdWNjacOzbg0KDQpgYGB7cn0NCnByb2R1Y3Rpb25fZ3JhZiA8LSAgbm9jc19mdWxsICU+JSANCiAgZmlsdGVyKGluZGljYXRvck5hbWUgJWluJSBjKCJPaWwgcHJvZHVjdGlvbiIsICJHYXMgcHJvZHVjdGlvbiIpKSAlPiUgDQogIG11dGF0ZShvYnNlcnZhdGlvbiA9IG9ic2VydmF0aW9uIC8gMTAwMDAwMCwNCiAgICAgICAgIGlkID0gMTpucm93KC4pKSAlPiUNCiAgZ3JvdXBfYnkoY29tcGFueSwgaW5kaWNhdG9yTmFtZSwgeWVhciwgcmVnaW9uICkgJT4lIA0KICBtdXRhdGUob2JzZXJ2YXRpb24gPSBzdW0ob2JzZXJ2YXRpb24sIG5hLnJtID0gVCkpICU+JSANCiAgZ2dwbG90KGFlcyh5ZWFyLCBvYnNlcnZhdGlvbiAsIGNvbG9yID0gY29tcGFueSkpKw0KICBnZW9tX3BvaW50KHNpemUgPSAwLjgsIGFscGhhID0gMC45LCBhZXMoc2hhcGUgPSBjb3VudHJ5KSkrDQogIGxhYnModGl0bGUgPSAgIk9pbCAmIGdhcyBwcm9kdWN0aW9uIiwNCiAgICAgICB4ID0gIkHDsW8iLCB5ID0gIk1pbGxvbnMgZGUgYmFycmlsZXMgZGUgcGV0csOzbGVvIGVxdWl2YWxlbnRlL2TDrWEiKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpKSsNCiAgZmFjZXRfZ3JpZChpbmRpY2F0b3JOYW1lfnJlZ2lvbiwgbGFiZWxsZXIgPSBsYWJlbF93cmFwX2dlbih3aWR0aD0xNykpDQpnZ3Bsb3RseShwcm9kdWN0aW9uX2dyYWYpDQpgYGANCg0KIyBBY3Rpdm8geSBQYXRyaW1vbmlvIE5ldG8gDQoNCmBgYHtyfQ0KYXNzZXRzX2dyYWYgPC0gIG5vY3NfZnVsbCAlPiUgDQogIGZpbHRlcihpbmRpY2F0b3JOYW1lICVpbiUgYyggIlRvdGFsIGFzc2V0cyIpLA0KICAgICAgICAgeWVhciA9PSAyMDE3LCB1bml0cyA9PSAiVVNEIG1pbGxpb24iLA0KICAgICAgICAgIWlzLm5hKG9ic2VydmF0aW9uKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IHJlb3JkZXIoY29tcGFueSwtb2JzZXJ2YXRpb24pICwgeT0gb2JzZXJ2YXRpb24sIGZpbGwgPSBjb21wYW55KSkrDQogIGdlb21fY29sKHBvc2l0aW9uID0gInN0YWNrIikrDQogIGxhYnModGl0bGUgPSAgIlRvdGFsIGFzc2V0cyIsDQogICAgICAgeCA9ICJFbXByZXNhIiwgeSA9ICJNTSBVU0QiKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpKQ0KICAjIGZhY2V0X2dyaWQoaW5kaWNhdG9yTmFtZX5yZWdpb24sIGxhYmVsbGVyID0gbGFiZWxfd3JhcF9nZW4od2lkdGg9MTcpKQ0KZ2dwbG90bHkoYXNzZXRzX2dyYWYpDQoNCmBgYA0KDQpgYGB7cn0NCmFzc2V0c19ncmFmIDwtICBub2NzX2Z1bGwgJT4lIA0KICBmaWx0ZXIoaW5kaWNhdG9yTmFtZSAlaW4lIGMoICJFcXVpdHkiKSwNCiAgICAgICAgIHllYXIgPT0gMjAxNywgdW5pdHMgPT0gIlVTRCBtaWxsaW9uIiwNCiAgICAgICAgICFpcy5uYShvYnNlcnZhdGlvbikpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKGNvbXBhbnksLW9ic2VydmF0aW9uKSAsIHk9IG9ic2VydmF0aW9uLCBmaWxsID0gY29tcGFueSkpKw0KICBnZW9tX2NvbChwb3NpdGlvbiA9ICJzdGFjayIpKw0KICBsYWJzKHRpdGxlID0gICJUb3RhbCBFcXVpdHkiLCBzdWJ0aXRsZT0gIlllYXIgMjAxNyIsDQogICAgICAgeCA9ICJFbXByZXNhIiwgeSA9ICJNTSBVU0QiKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpKQ0KICAjIGZhY2V0X2dyaWQoaW5kaWNhdG9yTmFtZX5yZWdpb24sIGxhYmVsbGVyID0gbGFiZWxfd3JhcF9nZW4od2lkdGg9MTcpKQ0KZ2dwbG90bHkoYXNzZXRzX2dyYWYpDQpgYGANCg0KIyBJbnZlcnNpw7NuIGVuIGNhcGl0YWwNCg0KDQpgYGB7cn0NCmNhcGV4X2dyYWYgPC0gIG5vY3NfZnVsbCAlPiUgDQogIGZpbHRlcihpbmRpY2F0b3JOYW1lICVpbiUgYygiQ2FwaXRhbCBleHBlbmRpdHVyZXMiKSwgdW5pdHMgPT0gIlVTRCBtaWxsaW9uIikgJT4lDQogIGdncGxvdChhZXMoeCA9IHllYXIsIHk9IG9ic2VydmF0aW9uLCBjb2xvciA9IGNvbXBhbnkpKSsNCiAgZ2VvbV9saW5lKGFlcyhsaW5ldHlwZSA9IGNvdW50cnkpKSsNCiAgbGFicyh0aXRsZSA9ICAiQ2FwaXRhbCBleHBlbmRpdHVyZXMgKENBUEVYKSIsDQogICAgICAgeCA9ICJBw7FvIiwgeSA9ICJNTSBVU0QiKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpLA0KICAgICAgICBzdHJpcC50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpKSsNCiAgZmFjZXRfZ3JpZCh+cmVnaW9uLCBsYWJlbGxlciA9IGxhYmVsX3dyYXBfZ2VuKHdpZHRoPTE1KSkNCg0KZ2dwbG90bHkoY2FwZXhfZ3JhZikNCmBgYA0KDQoNCiMgUmVudGFiaWxpZGFkDQoNCiMjIERhdGEgRnJhbWUgY29uIGluZGljYWRvcmVzDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQojcGFyYSBjw6FsY3VsbyBkZSByZW50YWJpbGlkYWQNCm5vY3NfZGYgPC0gbm9jc19mdWxsICU+JQ0KICBzZWxlY3QoeWVhciwgY29tcGFueSwgcmVnaW9uLCBjb3VudHJ5LCBwcm9kdWN0aW9uR3JvdXAsIGluZGljYXRvck5hbWUsIHVuaXRzLCBvYnNlcnZhdGlvbikgJT4lIA0KICBmaWx0ZXIoaW5kaWNhdG9yTmFtZSAlaW4lIGMoIkxvbmd0ZXJtL2ZpeGVkIGFzc2V0cyIsICJDYXNoIGFuZCBjYXNoIGVxdWl2YWxlbnRzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmV0IGluY29tZSBhZnRlciB0YXhlcyIsICJJbmNvbWUgdGF4IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcXVpdHkiLCJUb3RhbCBhc3NldHMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUb3RhbCBsaWFiaWxpdGllcyIgLCAiQ3VycmVudCBsaWFiaWxpdGllcyIgKSwNCiAgICAgICAgIHVuaXRzID09ICJVU0QgbWlsbGlvbiIpICU+JQ0KICBtdXRhdGUocm93X2lkID0gMTpucm93KC4pDQogICAgICAgICAjICwgb2JzZXJ2YXRpb24gPSBhcy5kb3VibGUob2JzZXJ2YXRpb24pDQogICAgICAgICApICU+JQ0KICBzcHJlYWQoLiwNCiAgICAgICAgIGtleSA9IGluZGljYXRvck5hbWUsDQogICAgICAgICB2YWx1ZSA9IG9ic2VydmF0aW9uKSAlPiUgDQogIHNlbGVjdCgtYyhyb3dfaWQpKSAlPiUgDQogIHJlbmFtZSggZml4ZWRfYXNzZXRzID0gIkxvbmd0ZXJtL2ZpeGVkIGFzc2V0cyIsIGNhc2hfYW5kX2VxdWkgPSAiQ2FzaCBhbmQgY2FzaCBlcXVpdmFsZW50cyIsDQogICAgICAgICBuZXRfaW5jb21lX2FmdGVyX3RheCA9ICJOZXQgaW5jb21lIGFmdGVyIHRheGVzIiAsIGluY29tZV90YXggPSAiSW5jb21lIHRheCIsDQogICAgICAgICBlcXVpdHkgPSAiRXF1aXR5IiwgIGFzc2V0cyA9ICJUb3RhbCBhc3NldHMiLA0KICAgICAgICAgbGlhYmlsaXRpZXMgPSAiVG90YWwgbGlhYmlsaXRpZXMiLCBjdXJyZW50X2xpYWJpbGl0aWVzID0gIkN1cnJlbnQgbGlhYmlsaXRpZXMiKSAlPiUgDQogIG11dGF0ZShuZXRfaW5jb21lX2FmdGVyX3RheCA9IGFzLmRvdWJsZShuZXRfaW5jb21lX2FmdGVyX3RheCksDQogICAgICAgICBmaXhlZF9hc3NldHMgPSBhcy5kb3VibGUoZml4ZWRfYXNzZXRzKSwNCiAgICAgICAgIGNhc2hfYW5kX2VxdWkgPSBhcy5kb3VibGUoY2FzaF9hbmRfZXF1aSksDQogICAgICAgICBpbmNvbWVfdGF4ID0gYXMuZG91YmxlKGluY29tZV90YXgpLA0KICAgICAgICAgZXF1aXR5ID0gYXMuZG91YmxlKGVxdWl0eSksDQogICAgICAgICBsaWFiaWxpdGllcyA9IGFzLmRvdWJsZShsaWFiaWxpdGllcyksDQogICAgICAgICB5ZWFyID0gcGFyc2VfZGF0ZV90aW1lKHllYXIsIG9yZGVycyA9ICJ5IikpICU+JSANCiAgZ3JvdXBfYnkoeWVhciwgY29tcGFueSwgY291bnRyeSwgcmVnaW9uLCBwcm9kdWN0aW9uR3JvdXAsIHVuaXRzKSAlPiUNCiAgc3VtbWFyaXNlKGZpeGVkX2Fzc2V0cyA9IHN1bShmaXhlZF9hc3NldHMsIG5hLnJtID0gVCksDQogICAgICAgICAgICBjYXNoX2FuZF9lcXVpID0gc3VtKGNhc2hfYW5kX2VxdWksIG5hLnJtID0gVCksDQogICAgICAgICAgICBuZXRfaW5jb21lX2FmdGVyX3RheCA9IHN1bShuZXRfaW5jb21lX2FmdGVyX3RheCwgbmEucm0gPSBUKSwNCiAgICAgICAgICAgIGluY29tZV90YXggPSBzdW0oaW5jb21lX3RheCwgbmEucm0gPSAgVCksDQogICAgICAgICAgICBhc3NldHMgPSBzdW0oYXNzZXRzLCBuYS5ybSA9ICBUKSwNCiAgICAgICAgICAgIGxpYWJpbGl0aWVzID0gc3VtKGxpYWJpbGl0aWVzLCBuYS5ybSA9ICBUKSwNCiAgICAgICAgICAgIGN1cnJlbnRfbGlhYmlsaXRpZXMgPSBzdW0oY3VycmVudF9saWFiaWxpdGllcywgbmEucm0gPSAgVCksDQogICAgICAgICAgICBlcXVpdHkgPSBzdW0oZXF1aXR5LCBuYS5ybSA9ICBUKSwNCiAgICAgICAgICAgIEtUQSA9IGNhc2hfYW5kX2VxdWkgKyBmaXhlZF9hc3NldHMsDQogICAgICAgICAgICB0Z19iZWZvcmV0YXggPSAoaW5jb21lX3RheCArIG5ldF9pbmNvbWVfYWZ0ZXJfdGF4KSAvIEtUQSwNCiAgICAgICAgICAgIHRnX2FmdGVydGF4ID0gbmV0X2luY29tZV9hZnRlcl90YXggLyBLVEEsDQogICAgICAgICAgICByYXRpb19lbmRldWRhbWllbnRvID0gbGlhYmlsaXRpZXMgLyBlcXVpdHksIA0KICAgICAgICAgICAgcmF0aW9fZW5kZXVkYW1pZW50b19jcCA9IGN1cnJlbnRfbGlhYmlsaXRpZXMvZXF1aXR5LA0KICAgICAgICAgICAgcGFzaXZvX2FjdGl2byA9IGxpYWJpbGl0aWVzL2Fzc2V0cywNCiAgICAgICAgICAgIHJhdGlvX3NvbHZlbmNpYSA9ICBlcXVpdHkgL2xpYWJpbGl0aWVzKSANCg0KIyBub2NzX2RmICU+JSBhcnJhbmdlKC10Z19hZnRlcnRheCkgJT4lIA0KIyAgIHNlbGVjdChjb21wYW55LCBLVEEsIHRnX2FmdGVydGF4KQ0KDQpub2NzX2RmDQoNCm5vY3NfZGZbc2FwcGx5KG5vY3NfZGYsIGlzLmluZmluaXRlKV0gPC0gTkENCg0KDQpgYGANCg0KIyMgUmVudGFiaWxpZGFkIG1lZGlhIGRlIGxhIHJhbWENCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQp0Z19tZWRpYSA8LSBub2NzX2RmICU+JQ0KICAgIGdyb3VwX2J5KHllYXIpICU+JSANCiAgICBzdW1tYXJpc2UoDQogICAgICAgICAgICAgICAgICB0Z19tZWRpYV9iZWZvcmVfdGF4ID0gc3VtKGluY29tZV90YXgsIG5ldF9pbmNvbWVfYWZ0ZXJfdGF4LCBuYS5ybSA9ICBUKS8gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bShmaXhlZF9hc3NldHMsIGNhc2hfYW5kX2VxdWksIG5hLnJtID0gVCksDQogICAgICAgICAgICAgICAgICB0Z19tZWRpYV9hZnRlcl90YXggPSBzdW0obmV0X2luY29tZV9hZnRlcl90YXgsIG5hLnJtID0gIFQpIC8gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bShmaXhlZF9hc3NldHMsIGNhc2hfYW5kX2VxdWksIG5hLnJtID0gVCkpICU+JSANCiAgICAgICAgICAgICAgICAgICMgdGdfbWVkaWFfYmVmb3JlX3RheF9tZWFuID0gc3VtKG1lYW4oaW5jb21lX3RheCwgbmEucm0gPSAgVCksIA0KICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhbihuZXRfaW5jb21lX2FmdGVyX3RheCwgbmEucm0gPSBUKSwgbmEucm0gPSBUKS8gDQogICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0obWVhbihmaXhlZF9hc3NldHMsIG5hLnJtID0gVCksIA0KICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYW4oY2FzaF9hbmRfZXF1aSwgbmEucm0gPSBUKSwgbmEucm0gPSBUKSwNCiAgICAgICAgICAgICAgICAgICMgdGdfbWVkaWFfYWZ0ZXJfdGF4X21lYW4gPSBtZWFuKG5ldF9pbmNvbWVfYWZ0ZXJfdGF4LCBuYS5ybSA9IFQpLyANCiAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bShtZWFuKGZpeGVkX2Fzc2V0cywgbmEucm0gPSBUKSwgDQogICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhbihjYXNoX2FuZF9lcXVpLCBuYS5ybSA9IFQpLCBuYS5ybSA9IFQpKSAlPiUgDQogICAgIGdhdGhlciguLA0KICAgICAgICAgICAgICAga2V5ID0gdmFyaWFibGUsDQogICAgICAgICAgICAgICB2YWx1ZSA9IHZhbG9yLCANCiAgICAgICAgICAgICAgIDI6MykgDQogICAgIyBtdXRhdGUobWV0b2RvID0gY2FzZV93aGVuKCBzdHJfc3ViKHZhcmlhYmxlWy0zXSkpKQ0KICAgICAgICAgICAgICAgIA0KDQp0Z19tZWRpYV9ncmFmIDwtIHRnX21lZGlhICU+JSANCiAgIyBmaWx0ZXIodmFyaWFibGUgPT0gInRnX21lZGlhX2JlZm9yZV90YXhfbWVhbiIpICU+JSANCiAgZ2dwbG90KGFlcyh5ZWFyLCB2YWxvciwgY29sb3IgPSB2YXJpYWJsZSkpKw0KICBnZW9tX2xpbmUoKSsNCiAgbGFicyh0aXRsZSA9ICAiTk9DJ3MuIFRhc2EgZGUgR2FuYW5jaWEgbWVkaWEiKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KQ0KdGdfbWVkaWFfZ3JhZg0KICAgICANCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0Kbm9jc19kZl9jb25fbWVkaWEgPC0gbm9jc19kZiAlPiUgDQogIGJpbmRfcm93cyh0Z19tZWRpYSAlPiUgDQogICAgICAgICAgICAgIHNwcmVhZChrZXkgPSB2YXJpYWJsZSwNCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsb3IpICU+JSANCiAgICAgICAgICAgICAgbXV0YXRlKGNvbXBhbnkgPSAiVEcgTWVkaWEiKSAlPiUgDQogICAgICAgICAgICAgIHJlbmFtZSh0Z19iZWZvcmV0YXggPSB0Z19tZWRpYV9iZWZvcmVfdGF4LA0KICAgICAgICAgICAgICAgICAgICAgdGdfYWZ0ZXJ0YXggPSB0Z19tZWRpYV9hZnRlcl90YXgpKSAlPiUgDQogIG11dGF0ZShpc19tZWRpYSA9IGNhc2Vfd2hlbihjb21wYW55ID09ICJURyBNZWRpYSIgfiAibWVkaWEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICJlbXByZXNhcyIpKQ0KDQp3cml0ZS5jc3Yobm9jc19kZl9jb25fbWVkaWEsIGZpbGUgPSAiLi4vcmVzdWx0YWRvcy9jb21wYXJhY2lvbl9wYWlzZXMvbm9jc19kZl9jb25fbWVkaWEuY3N2IikNCg0KZ3JhZl9tZWRpYV9saW5lIDwtIG5vY3NfZGZfY29uX21lZGlhICU+JSANCiAgZ2dwbG90KGFlcyh5ZWFyLCB0Z19hZnRlcnRheCwgY29sb3IgPSBjb21wYW55LCBncm91cCA9IGlzX21lZGlhKSkrDQogIGdlb21fbGluZSgpKw0KICBnZW9tX3BvaW50KCkrDQogIGxhYnModGl0bGUgPSAgIk5PQydzLiBSZW50YWJpbGlkYWQgbWVkaWEgeSBkZWwgcmVzdG8gZGUgbGFzIGVtcHJlc2FzIGRlc3B1w6lzIGRlIGltcHVlc3RvcyIpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50LCBsaW1pdHMgPSBjKC0wLjMwLCAwLjcwKSxicmVha3MgPSBzZXEoLTAuMzAsIDAuNzAsIC4xKSkNCmdyYWZfbWVkaWFfbGluZQ0KYGBgDQoNCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmdyYWZfbWVkaWFfYm94IDwtIG5vY3NfZGYgJT4lIA0KICAjIGdncGxvdChhZXMoeWVhciwgdGdfYWZ0ZXJ0YXgsIGNvbG9yID0gY29tcGFueSwgc2l6ZSA9IGlzX21lZGlhKSkrDQogIGdncGxvdChhZXMoeWVhciwgdGdfYWZ0ZXJ0YXgsIGNvbG9yID0gY29tcGFueSwgZ3JvdXAgPSB5ZWFyKSkrDQogIGdlb21fYm94cGxvdCgpKw0KICAjIGdncGxvdChhZXMoZGF0YSA9IG5vY3NfZGZfY29uX21lZGlhICU+JSBmaWx0ZXIoY29tcGFueSA9PSAiVEcgTWVkaWEiKSwgeWVhciwgdGdfYWZ0ZXJ0YXgpKSsNCiAgIyBnZW9tX2xpbmUoKSsNCiAgbGFicyh0aXRsZSA9ICAiTk9DJ3MuIFJlbnRhYmlsaWRhZCBkZXNwdWVzIGRlIGltcHVlc3RvcyIpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50LCBsaW1pdHMgPSBjKC0wLjMsIC44KSwgYnJlYWtzID0gc2VxKC0wLjMsIC44LCAwLjEpKQ0KZ3JhZl9tZWRpYV9ib3gNCmBgYA0KDQoNCmBgYHtyfQ0Kc3VtbWFyeShub2NzX2RmICU+JSANCiAgZ3JvdXBfYnkoeWVhciwgcHJvZHVjdGlvbkdyb3VwKSAlPiUgDQogIHN1bW1hcmlzZSh0Z19hZnRlcnRheCA9IG1lYW4odGdfYWZ0ZXJ0YXgsIG5hLnJtID0gVCkpICU+JSANCiAgc3ByZWFkKC4sDQogICAgICAgICBrZXkgPSBwcm9kdWN0aW9uR3JvdXAsDQogICAgICAgICB2YWx1ZSA9ICB0Z19hZnRlcnRheCkpDQoNCmBgYA0KDQoNCiMjIFJlbnRhYmlsaWRhZCBzZWfDum4gdGFtYcOxbw0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnRnX2dyYWZfcHJvZF9ncm91cCA8LSBub2NzX2RmICU+JSANCiAgIyBmaWx0ZXIodGdfYWZ0ZXJ0YXggIT0gMCAmIGZpeGVkX2Fzc2V0cyA+IDAgJiB0Z19hZnRlcnRheCA8IDUgJiB0Z19hZnRlcnRheCA+IC0yMCApICU+JSAgDQogIGdncGxvdChhZXMoeWVhciwgdGdfYWZ0ZXJ0YXgsIGNvbG9yID0gY29tcGFueSkpKw0KICBnZW9tX2xpbmUoKSsNCiAgbGFicyh0aXRsZSA9ICAiTk9DJ3MuIFJlbnRhYmlsaWRhZCBkZXNwdWVzIGRlIGltcHVlc3Rvcy4gRGl2aXNpw7NuIHBvciB0YW1hw7FvIikrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSkrDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQsIGxpbWl0cyA9IGMoLTAuMywgLjgpLCBicmVha3MgPSBzZXEoLTAuMywgLjgsIDAuMjApKSsNCiAgZmFjZXRfZ3JpZCh+cHJvZHVjdGlvbkdyb3VwLCAgbGFiZWxsZXIgPSBsYWJlbF93cmFwX2dlbih3aWR0aD0xNykpDQpwbG90bHk6OmdncGxvdGx5KHRnX2dyYWZfcHJvZF9ncm91cCkNCmBgYA0KDQoNCiMjIFJlbnRhYmlsaWRhZCBzZWfDum4gcmVnacOzbg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnRnX2dyYWZfeHJlZ2lvbiA8LSBub2NzX2RmICU+JSANCiAgZmlsdGVyKHRnX2FmdGVydGF4ICE9IDAgJiBmaXhlZF9hc3NldHMgPiAwICYgdGdfYWZ0ZXJ0YXggPCAxICYgdGdfYWZ0ZXJ0YXggPiAtMjAgKSAlPiUNCiAgZ2dwbG90KGFlcyh5ZWFyLCB0Z19hZnRlcnRheCwgY29sb3IgPSBjb21wYW55KSkrDQogIGdlb21fbGluZSgpKw0KICBsYWJzKHRpdGxlID0gICJOT0Mncy4gUmVudGFiaWxpZGFkIGRlc3B1ZXMgZGUgaW1wdWVzdG9zLiBEaXZpc2nDs24gcG9yIHJlZ2nDs25zIikrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSkrDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpKw0KICBmYWNldF9ncmlkKH5yZWdpb24sICBsYWJlbGxlciA9IGxhYmVsX3dyYXBfZ2VuKHdpZHRoPTE3KSkNCg0KcGxvdGx5OjpnZ3Bsb3RseSh0Z19ncmFmX3hyZWdpb24pDQoNCmBgYA0KDQojIyBZUEYsIFBldHJvYnJhcyB5IGVtcHJlc2FzIHNlbGVjY2lvbmFkYXMNCg0KYGBge3J9DQpmaWx0cm9fZW1wX2RmIDwtICBub2NzX2RmICAlPiUNCiAgdW5ncm91cCgpICU+JSANCiAgbXV0YXRlKGNvbXBhbnkgPSBjYXNlX3doZW4oIShjb21wYW55ICVpbiUgZmlsdHJvX2VtcHJlc2FzKSB+ICJNZWRpYSAocmVzdG8gZGUgZW1wcmVzYXMpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IGNvbXBhbnkpKSAlPiUgDQogIGdyb3VwX2J5KHllYXIsIGNvbXBhbnkpICU+JQ0KICBzdW1tYXJpc2UoZml4ZWRfYXNzZXRzID0gc3VtKGZpeGVkX2Fzc2V0cywgbmEucm0gPSBUKSwNCiAgICAgICAgICAgIGNhc2hfYW5kX2VxdWkgPSBzdW0oY2FzaF9hbmRfZXF1aSwgbmEucm0gPSBUKSwNCiAgICAgICAgICAgIG5ldF9pbmNvbWVfYWZ0ZXJfdGF4ID0gc3VtKG5ldF9pbmNvbWVfYWZ0ZXJfdGF4LCBuYS5ybSA9IFQpLA0KICAgICAgICAgICAgaW5jb21lX3RheCA9IHN1bShpbmNvbWVfdGF4LCBuYS5ybSA9ICBUKSwNCiAgICAgICAgICAgIGxpYWJpbGl0aWVzID0gc3VtKGxpYWJpbGl0aWVzLCBuYS5ybSA9ICBUKSwNCiAgICAgICAgICAgIGVxdWl0eSA9IHN1bShlcXVpdHksIG5hLnJtID0gIFQpLA0KICAgICAgICAgICAgS1RBID0gY2FzaF9hbmRfZXF1aSArIGZpeGVkX2Fzc2V0cywNCiAgICAgICAgICAgIHRnX2JlZm9yZXRheCA9IChpbmNvbWVfdGF4ICsgbmV0X2luY29tZV9hZnRlcl90YXgpIC8gS1RBLA0KICAgICAgICAgICAgdGdfYWZ0ZXJ0YXggPSBuZXRfaW5jb21lX2FmdGVyX3RheCAvIEtUQSwNCiAgICAgICAgICAgIHJhdGlvX2VuZGV1ZGFtaWVudG8gPSBsaWFiaWxpdGllcyAvIGVxdWl0eSwgDQogICAgICAgICAgICByYXRpb19zb2x2ZW5jaWEgPSAgZXF1aXR5IC9saWFiaWxpdGllcykNCmZpbHRyb19lbXBfZGYNCg0KDQp0Z19maWx0cm9fZ3JhZiA8LSBmaWx0cm9fZW1wX2RmICU+JSANCiAgZmlsdGVyKHRnX2FmdGVydGF4ICE9IDAgJiBmaXhlZF9hc3NldHMgPiAwICYgdGdfYWZ0ZXJ0YXggPCA1ICYgdGdfYWZ0ZXJ0YXggPiAtMjAgKSAlPiUgIA0KICBnZ3Bsb3QoYWVzKHllYXIsIHRnX2FmdGVydGF4LCBjb2xvciA9IGNvbXBhbnkpKSsNCiAgZ2VvbV9saW5lKCkrDQogIGxhYnModGl0bGUgPSAgIlJlbnRhYmlsaWRhZCIsDQogICAgICAgc3VidGl0bGUgPSAgIkVtcHJlc2FzIHNlbGVjY2lvbmFkYXMiKSsNCiAgIyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpKw0KICAjIGZhY2V0X3dyYXAofnByb2R1Y3Rpb25Hcm91cCkrDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpDQoNCiAgDQpnZ3Bsb3RseSh0Z19maWx0cm9fZ3JhZikNCmBgYA0KDQpgYGB7cn0NCnRnX2dyYWZfeXBmIDwtIG5vY3NfZGYgJT4lICANCiAgbXV0YXRlKGlzX3lwZiA9IGNhc2Vfd2hlbihjb21wYW55ID09ICJZUEYiIH4gIllQRiIgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiT3RoZXIiKSkgJT4lIA0KICBmaWx0ZXIodGdfYWZ0ZXJ0YXggIT0gMCAmIGZpeGVkX2Fzc2V0cyA+IDAgJiB0Z19hZnRlcnRheCA8IDEgJiB0Z19hZnRlcnRheCA+IC0yMCApICU+JQ0KICBnZ3Bsb3QoYWVzKHllYXIsIHRnX2FmdGVydGF4LCBjb2xvciA9IGlzX3lwZikpKw0KICAjIGdncGxvdChhZXMoeWVhciwgdGdfYWZ0ZXJ0YXgsIGNvbG9yID0gY29tcGFueSwgc2l6ZSA9IGlzX3lwZikpKw0KICBnZW9tX3BvaW50KGFscGhhID0gMC42KSsNCiAgc3RhdF9zbW9vdGgobGV2ZWwgPSAwLjMwKSsNCiAgbGFicyh0aXRsZSA9ICAiTk9DJ3MuIFJlbnRhYmlsaWRhZCBkZSBZUEYgdnMgcmVzdG8gZGUgbGFzIGVtcHJlc2FzIikrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikrDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQsIGxpbWl0cyA9IGMoLTAuMzUsIDAuNzUpKQ0KDQpnZ3Bsb3RseSh0Z19ncmFmX3lwZikNCg0KYGBgDQoNCg0KDQpgYGB7cn0NCiMgcnV0YV9ncmFmX3RnIDwtICJ0Z19maWx0cm9fZ3JhZi5wbmciDQojIHBuZyhydXRhX2dyYWZfdGcpDQojIHByaW50KHRnX2ZpbHRyb19ncmFmKQ0KIyBkZXYub2ZmKCkNCg0KYGBgDQoNCmBgYHtyIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpmaWx0cm9fZW1wX2RmIDwtICBub2NzX2RmICAlPiUNCiAgdW5ncm91cCgpICU+JSANCiAgbXV0YXRlKGNvbXBhbnkgPSBjYXNlX3doZW4oIShjb21wYW55ICVpbiUgZmlsdHJvX2VtcHJlc2FzKSB+ICJSZXN0byIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiBjb21wYW55KSkgJT4lIA0KICBncm91cF9ieSh5ZWFyLCBjb21wYW55KSAlPiUNCiAgc3VtbWFyaXNlKGZpeGVkX2Fzc2V0cyA9IHN1bShmaXhlZF9hc3NldHMsIG5hLnJtID0gVCksDQogICAgICAgICAgICBjYXNoX2FuZF9lcXVpID0gc3VtKGNhc2hfYW5kX2VxdWksIG5hLnJtID0gVCksDQogICAgICAgICAgICBuZXRfaW5jb21lX2FmdGVyX3RheCA9IHN1bShuZXRfaW5jb21lX2FmdGVyX3RheCwgbmEucm0gPSBUKSwNCiAgICAgICAgICAgIGluY29tZV90YXggPSBzdW0oaW5jb21lX3RheCwgbmEucm0gPSAgVCksDQogICAgICAgICAgICBsaWFiaWxpdGllcyA9IHN1bShsaWFiaWxpdGllcywgbmEucm0gPSAgVCksDQogICAgICAgICAgICBlcXVpdHkgPSBzdW0oZXF1aXR5LCBuYS5ybSA9ICBUKSwNCiAgICAgICAgICAgIEtUQSA9IGNhc2hfYW5kX2VxdWkgKyBmaXhlZF9hc3NldHMsDQogICAgICAgICAgICB0Z19iZWZvcmV0YXggPSAoaW5jb21lX3RheCArIG5ldF9pbmNvbWVfYWZ0ZXJfdGF4KSAvIEtUQSwNCiAgICAgICAgICAgIHRnX2FmdGVydGF4ID0gbmV0X2luY29tZV9hZnRlcl90YXggLyBLVEEsDQogICAgICAgICAgICByYXRpb19lbmRldWRhbWllbnRvID0gbGlhYmlsaXRpZXMgLyBlcXVpdHksIA0KICAgICAgICAgICAgcmF0aW9fc29sdmVuY2lhID0gIGVxdWl0eSAvbGlhYmlsaXRpZXMpIA0KZmlsdHJvX2VtcF9kZg0KDQoNCnRnX3lwZl9wZXRyb2JyYXMgPC0gZmlsdHJvX2VtcF9kZiAlPiUgDQogIGZpbHRlcihjb21wYW55ICVpbiUgYygiWVBGIiAgICwgICAiUGV0cm9icmFzIikpICU+JSANCiAgZ2dwbG90KGFlcyh5ZWFyLCB0Z19hZnRlcnRheCwgY29sb3IgPSBjb21wYW55KSkrDQogIGdlb21fbGluZSgpKw0KICBsYWJzKHRpdGxlID0gICJUYXNhIGRlIEdhbmFuY2lhIGRlc3B1w6lzIGRlIGltcHVlc3RvcyIsDQogICAgICAgc3VidGl0bGUgPSAgIk5PQydzLiBFbXByZXNhcyBzZWxlY2Npb25hZGFzIikrDQogICMgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSsNCiAgIyBmYWNldF93cmFwKH5wcm9kdWN0aW9uR3JvdXApKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KQ0KDQpnZ3Bsb3RseSh0Z195cGZfcGV0cm9icmFzKQ0KYGBgDQoNCiMgQW5hbGlzaXMgZGUgY29ycmVsYWNpw7NuIA0KYGBge3J9DQojQ29ycmVsYWNpw7NuIGVudHJlIEtUQSB5IGdhbmFuY2lhcyBkZXNwdcOpcyBkZSBpbXB1ZXN0b3MNCmNvcih4ID0gbm9jc19kZiRLVEEsIA0KICAgIHkgPSBub2NzX2RmJG5ldF9pbmNvbWVfYWZ0ZXJfdGF4LCB1c2UgPSAiY29tcGxldGUub2JzIiwNCiAgICBtZXRob2QgPSAic3BlYXJtYW4iKQ0KDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmdyYWZfY29ycl9rdGFfZ2NpYSA8LSBub2NzX2RmICU+JQ0KICAjICBmaWx0ZXIocHJvZHVjdGlvbkdyb3VwID09ICJMYXJnZSBkb21lc3RpYyBwcm9kdWNlcnMiLA0KICAjICAgdGdfYWZ0ZXJ0YXggIT0gMCAmIGZpeGVkX2Fzc2V0cyA+IDAgJiB0Z19hZnRlcnRheCA8IDIuNSAmIHRnX2FmdGVydGF4ID4gLTIwICkgJT4lDQogIGdncGxvdChhZXMoS1RBLCBuZXRfaW5jb21lX2FmdGVyX3RheCkpKw0KICBnZW9tX3BvaW50KCkrDQogIGdlb21fc21vb3RoKCkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikrDQogIGxhYnModGl0bGUgPSAiQW7DoWxpc2lzIGRlIGNvcnJlbGFjacOzbiBlbnRyZSBpbmdyZXNvIG5ldG8geSBzdG9jayBkZSBjYXBpdGFsIiwNCiAgICAgICB4ID0gIlN0b2NrIGRlIENhcGl0YWwiLCB5ID0gIkluZ3Jlc28gTmV0byIpDQpwbG90bHk6OmdncGxvdGx5KGdyYWZfY29ycl9rdGFfZ2NpYSkNCmBgYA0KDQpgYGB7cn0NCiNDb3JyZWxhY2nDs24gZW50cmUgQ0FQRVggeSBnYW5hbmNpYXMgZGVzcHXDqXMgZGUgaW1wdWVzdG9zDQpub2NzX3NwcmVhZCA8LSBub2NzX2Z1bGwgJT4lIA0KICBzZWxlY3QoeWVhciwgY29tcGFueSwgcmVnaW9uLCBjb3VudHJ5LCBwcm9kdWN0aW9uR3JvdXAsIGluZGljYXRvck5hbWUsIHVuaXRzLCBvYnNlcnZhdGlvbikgJT4lIA0KICBmaWx0ZXIodW5pdHMgPT0gIlVTRCBtaWxsaW9uIikgJT4lIA0KICBtdXRhdGUocm93X2lkID0gMTpucm93KC4pKSAlPiUNCiAgc3ByZWFkKC4sDQogICAgICAgICBrZXkgPSBpbmRpY2F0b3JOYW1lLA0KICAgICAgICAgdmFsdWUgPSAgb2JzZXJ2YXRpb24pDQogDQpub2NzX3NwcmVhZF8yIDwtIG5vY3NfZnVsbCAlPiUNCiAgc2VsZWN0KHllYXIsIGNvbXBhbnksIHJlZ2lvbiwgY291bnRyeSwgcHJvZHVjdGlvbkdyb3VwLCBpbmRpY2F0b3JOYW1lLCB1bml0cywgb2JzZXJ2YXRpb24pICU+JSANCiAgZmlsdGVyKGluZGljYXRvck5hbWUgJWluJSBjKCJPcGVyYXRpb25hbCBleHBlbmRpdHVyZXMiLCAiVG90YWwgcmV2ZW51ZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhcGl0YWwgZXhwZW5kaXR1cmVzIiwgIk5ldCBpbmNvbWUgYWZ0ZXIgdGF4ZXMiKSwNCiAgICAgICAgIHVuaXRzID09ICJVU0QgbWlsbGlvbiIpICU+JQ0KICBtdXRhdGUocm93X2lkID0gMTpucm93KC4pKSAlPiUNCiAgc3ByZWFkKC4sDQogICAgICAgICBrZXkgPSBpbmRpY2F0b3JOYW1lLA0KICAgICAgICAgdmFsdWUgPSBvYnNlcnZhdGlvbikgJT4lDQogIHJlbmFtZShjYXBleCA9ICdDYXBpdGFsIGV4cGVuZGl0dXJlcycsDQogICAgICAgICBuZXRfaW5jb21lID0gIk5ldCBpbmNvbWUgYWZ0ZXIgdGF4ZXMiKSAlPiUgDQogIGdyb3VwX2J5KGNvbXBhbnksIHllYXIpICU+JSANCiAgc3VtbWFyaXNlKGNhcGV4ID0gc3VtKGNhcGV4LCBuYS5ybSA9IFQpLA0KICAgICAgICAgICAgbmV0X2luY29tZSA9IHN1bShuZXRfaW5jb21lLCBuYS5ybSA9IFQpKQ0KDQoNCg0KY29yKHggPSBub2NzX3NwcmVhZF8yJGNhcGV4LCANCiAgICB5ID0gbm9jc19zcHJlYWRfMiRuZXRfaW5jb21lLCB1c2UgPSAiY29tcGxldGUub2JzIiwNCiAgICBtZXRob2QgPSAic3BlYXJtYW4iKQ0KDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmdyYWZfY29ycl9rdGFfZ2NpYSA8LSBub2NzX3NwcmVhZF8yICU+JQ0KIGdncGxvdChhZXMoY2FwZXgsIG5ldF9pbmNvbWUpKSsNCiAgZ2VvbV9wb2ludCgpKw0KICBnZW9tX3Ntb290aCgpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpKw0KICBsYWJzKHRpdGxlID0gIkFuw6FsaXNpcyBkZSBjb3JyZWxhY2nDs24gZW50cmUgaW5ncmVzbyBuZXRvIHkgQ0FQRVgiLA0KICAgICAgIHggPSAiQ0FQRVgiLCB5ID0gIkluZ3Jlc28gTmV0byIpDQpwbG90bHk6OmdncGxvdGx5KGdyYWZfY29ycl9rdGFfZ2NpYSkNCmBgYA0KDQoNCiMgRW5kZXVkYW1pZW50bw0KDQojIyBTb2x2ZW5jaWENCg0KJCQgU29sdmVuY2lhID0gXGZyYWN7UGF0cmltb25pbyBOZXRvfXtQYXNpdm99JCQNCg0KYGBge3J9DQpub2NzX2RmICU+JSANCiAgZ2dwbG90KGFlcyh5ZWFyLCByYXRpb19zb2x2ZW5jaWEgLGdyb3VwID0geWVhcikpKw0KICBnZW9tX2JveHBsb3QoKSArDQogICMgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBjb21wYW55KSkrDQogICMgZ2VvbV9saW5lKGFlcyhncm91cCA9IGNvbXBhbnkpKSsNCiAgZ2VvbV9saW5lKGRhdGEgPSBub2NzX2RmICU+JSBmaWx0ZXIoY29tcGFueSA9PSAiWVBGIiksIA0KICAgICAgICAgICAgYWVzKHllYXIsIHJhdGlvX3NvbHZlbmNpYSxjb2xvciA9ICJibHVlIiwgZ3JvdXAgPSBjb21wYW55KSwgc2l6ZSA9IDEpKw0KICBnZW9tX2xpbmUoZGF0YSA9IG5vY3NfZGYgJT4lIGZpbHRlcihjb21wYW55ID09ICJQRFZTQSIpLCANCiAgICAgICAgICAgIGFlcyh5ZWFyLCByYXRpb19zb2x2ZW5jaWEsY29sb3IgPSAicmVkIiwgZ3JvdXAgPSBjb21wYW55KSwgc2l6ZSA9IDEpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpKw0KICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1Y2nDs24gZGUgcmF0aW8gZGUgc29sdmVuY2lhIHBhcmEgdG9kYXMgbGFzIGVtcHJlc2FzIGUgWVBGIikNCg0KZ2dwbG90KG5vY3NfZGYgJT4lIGZpbHRlcihjb21wYW55ID09ICJZUEYiKSkrDQogIGdlb21fbGluZSggYWVzKHllYXIsIHJhdGlvX3NvbHZlbmNpYSwgZ3JvdXAgPSBjb21wYW55KSkrDQogIGxhYnModGl0bGUgPSAiUmF0aW8gZGUgc29sdmVuY2lhIGRlIFlQRiIpDQoNCmBgYA0KDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpzb2x2ZW5jaWFfZ3JhZiA8LSBub2NzX2RmICU+JSANCiAgZmlsdGVyKHJhdGlvX3NvbHZlbmNpYSA+PTAgJiByYXRpb19zb2x2ZW5jaWEgPCA0KSAlPiUgDQogIGdncGxvdChhZXMoeWVhciwgcmF0aW9fc29sdmVuY2lhLCBjb2xvciA9IGNvbXBhbnkpKSsNCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNSkrDQogIGxhYnModGl0bGUgPSAgIlJhdGlvIGRlIHNvbHZlbmNpYSB0b2RhcyBsYXMgZW1wcmVzYXMiKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSsNCiAgIyBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSsNCiAgZmFjZXRfd3JhcCh+cHJvZHVjdGlvbkdyb3VwKQ0KZ2dwbG90bHkoc29sdmVuY2lhX2dyYWYpDQpgYGANCmBgYHtyfQ0Kc29sdmVuY2lhX2dyYWZfMiA8LSBub2NzX2RmICU+JSANCiAgIyBmaWx0ZXIocmF0aW9fc29sdmVuY2lhID49MCAmIHJhdGlvX3NvbHZlbmNpYSA8IDQpICU+JSANCiAgZmlsdGVyKGNvbXBhbnkgJWluJSBlbXByZXNhc19BTCRjb21wYW55KSAlPiUgDQogIGdncGxvdChhZXMoeWVhciwgcmF0aW9fc29sdmVuY2lhLCBjb2xvciA9IGNvbXBhbnkpKSsNCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNSkrDQogIGxhYnModGl0bGUgPSAgIlJhdGlvIGRlIHNvbHZlbmNpYSBkZSBlbXByZXNhcyBkZSBBTCIpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpKw0KICAjIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpKw0KICBmYWNldF93cmFwKH5wcm9kdWN0aW9uR3JvdXApDQoNCmdncGxvdGx5KHNvbHZlbmNpYV9ncmFmXzIpDQpgYGANCg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0Kc29sdmVuY2lhX2ZpbHRyb19ncmFmIDwtIGZpbHRyb19lbXBfZGYgJT4lIA0KICAjIGZpbHRlcihyYXRpb19zb2x2ZW5jaWEgPj0wICYgcmF0aW9fc29sdmVuY2lhIDwgNCkgJT4lIA0KICBnZ3Bsb3QoYWVzKHllYXIsIHJhdGlvX3NvbHZlbmNpYSwgY29sb3IgPSBjb21wYW55KSkrDQogIGdlb21fbGluZSgpKw0KICBnZW9tX3BvaW50KGFscGhhID0gMSwgc2l6ZSA9IDMpKw0KICBsYWJzKHRpdGxlID0gICJSYXRpbyBkZSBzb2x2ZW5jaWEgZW1wcmVzYXMgc2VsZWNjaW9uYWRhcyIpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb249ImJvdHRvbSIpDQogICMgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkrDQoNCnNvbHZlbmNpYV9maWx0cm9fZ3JhZg0KYGBgDQojIyBFbmRldWRhbWllbnRvDQoNCiMjIyBSYXRpbyBkZSBlbmRldWRhbWllbnRvDQokJCBFbmRldWRhbWllbnRvID0gXGZyYWN7UGFzaXZvfXtQYXRyaW1vbmlvIE5ldG99ICQkDQoNCmBgYHtyfQ0KcGx0X2VuZGV1IDwtIG5vY3NfZGYgJT4lIA0KICBnZ3Bsb3QoYWVzKHllYXIsIHJhdGlvX2VuZGV1ZGFtaWVudG8gLGdyb3VwID0geWVhcikpKw0KICBnZW9tX2JveHBsb3QoKSArDQogICMgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBjb21wYW55KSkrDQogICMgZ2VvbV9saW5lKGFlcyhncm91cCA9IGNvbXBhbnkpKSsNCiAgZ2VvbV9saW5lKGRhdGEgPSBub2NzX2RmICU+JSBmaWx0ZXIoY29tcGFueSA9PSAiUERWU0EiKSwgDQogICAgICAgICAgICBhZXMoeWVhciwgcmF0aW9fZW5kZXVkYW1pZW50byxjb2xvciA9ICJQRFZTQSIsIGdyb3VwID0gY29tcGFueSksIHNpemUgPSAxKSsNCiAgZ2VvbV9saW5lKGRhdGEgPSBub2NzX2RmICU+JSBmaWx0ZXIoY29tcGFueSA9PSAiWVBGIiksIA0KICAgICAgICAgICAgYWVzKHllYXIsIHJhdGlvX2VuZGV1ZGFtaWVudG8sY29sb3IgPSAiWVBGIiwgZ3JvdXAgPSBjb21wYW55KSwgc2l6ZSA9IDEpKw0KICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJFbXByZXNhIiwgDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJQRFZTQSIsICJZUEYiKSwNCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoICAiYnJvd240IiwgImJsdWUxIikpKw0KICAgICAgICAgICAgICAgICAgICAgIyB2YWx1ZXMgPSBjKCJQRFZTQSIgPSAgInJlZCIsICJZUEYiID0gImJsdWUiKSkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSsNCiAgbGFicyh0aXRsZSA9ICJSYXRpbyBkZSBlbmRldWRhbWllbnRvIGRlIE5PQydzIiwgeCA9ICIiLCB5PSIiLA0KICAgICAgIHN1YnRpdGxlID0gIllQRiB5IFBEVlNBIGZyZW50ZSBhbCByZXN0byBkZSBsYSBkaXN0cmlidWNpw7NuIikrDQogIHlsaW0oLTMsIDUgKQ0KcGx0X2VuZGV1ID0gcGxvdF90aGVtZShwbHRfZW5kZXUpDQpnZ3NhdmUocGxvdCA9IHBsdF9lbmRldSwgZmlsZSA9ICIuLi9yZXN1bHRhZG9zL2NvbXBhcmFjaW9uX3BhaXNlcy9lbmRldWRhbWllbnRvX3lwZl9wZHZzYS5wbmciLCANCiAgICAgICB3aWR0aCA9IDEwLCBoZWlnaHQgPSA1KQ0KDQpnZ3Bsb3Qobm9jc19kZiAlPiUgZmlsdGVyKGNvbXBhbnkgPT0gIllQRiIpKSsNCiAgZ2VvbV9saW5lKCBhZXMoeWVhciwgcmF0aW9fZW5kZXVkYW1pZW50bywgZ3JvdXAgPSBjb21wYW55KSkrDQogIGxhYnModGl0bGUgPSAiUmF0aW8gZGUgZW5kZXVkYW1pZW50byBkZSBZUEYiKQ0KDQpub2NzX2RmICU+JSANCiAgZ2dwbG90KGFlcyggcmF0aW9fZW5kZXVkYW1pZW50byApKSsjLGdyb3VwID0geWVhcikpKw0KICBnZW9tX2RlbnNpdHkoKSArDQogIGxhYnModGl0bGUgPSAiRGlzdHJpYnVjacOzbiBkZSByYXRpbyBkZSBlbmRldWRhbWllbnRvIGRlIE5PQydzIikrDQogIGZhY2V0X3dyYXAofnllYXIoeWVhciksIHNjYWxlcyA9ICJmcmVlIikNCg0KIyB0YXBwbHkobm9jc19kZiRyYXRpb19lbmRldWRhbWllbnRvLCBub2NzX2RmJHllYXIsIHN1bW1hcnkpDQoNCmxpYnJhcnkoZGF0YS50YWJsZSkNCm5vY3NfZHQgPSBhcy5kYXRhLnRhYmxlKG5vY3NfZGYpDQpub2NzX2R0WywgYXMubGlzdChzdW1tYXJ5KHJhdGlvX2VuZGV1ZGFtaWVudG8pKSwgYnkgPXllYXJdDQpgYGANCg0KYGBge3J9DQoNCm5vY3NfZGYgJT4lIA0KICBnZ3Bsb3QoYWVzKHllYXIsIHBhc2l2b19hY3Rpdm8gLGdyb3VwID0geWVhcikpKw0KICBnZW9tX2JveHBsb3QoKSArDQogICMgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBjb21wYW55KSkrDQogICMgZ2VvbV9saW5lKGFlcyhncm91cCA9IGNvbXBhbnkpKSsNCiAgZ2VvbV9saW5lKGRhdGEgPSBub2NzX2RmICU+JSBmaWx0ZXIoY29tcGFueSA9PSAiWVBGIiksIA0KICAgICAgICAgICAgYWVzKHllYXIsIHBhc2l2b19hY3Rpdm8sY29sb3IgPSAicmVkIiwgZ3JvdXAgPSBjb21wYW55KSwgc2l6ZSA9IDEpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpKw0KICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1Y2nDs24gZGUgUGFzaXZvL0FjdGl2byBkZSBOT0MncyBlIFlQRiIpDQogICMgeWxpbShOQSwgMTUgKQ0KDQpnZ3Bsb3Qobm9jc19kZiAlPiUgZmlsdGVyKGNvbXBhbnkgPT0gIllQRiIpKSsNCiAgZ2VvbV9saW5lKCBhZXMoeWVhciwgcGFzaXZvX2FjdGl2bywgZ3JvdXAgPSBjb21wYW55KSkrDQogIGxhYnModGl0bGUgPSAiUGFzaXZvL0FjdGl2byBkZSBZUEYiKQ0KDQpgYGANCg0KDQoNCmBgYHtyfQ0Kbm9jc19kZiAlPiUgDQogIGdncGxvdChhZXMoeWVhciwgcmF0aW9fZW5kZXVkYW1pZW50b19jcCAsZ3JvdXAgPSB5ZWFyKSkrDQogIGdlb21fYm94cGxvdCgpICsNCiAgIyBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGNvbXBhbnkpKSsNCiAgIyBnZW9tX2xpbmUoYWVzKGdyb3VwID0gY29tcGFueSkpKw0KICBnZW9tX2xpbmUoZGF0YSA9IG5vY3NfZGYgJT4lIGZpbHRlcihjb21wYW55ID09ICJZUEYiKSwgDQogICAgICAgICAgICBhZXMoeWVhciwgcmF0aW9fZW5kZXVkYW1pZW50b19jcCxjb2xvciA9ICJyZWQiLCBncm91cCA9IGNvbXBhbnkpLCBzaXplID0gMSkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikrDQogIGxhYnModGl0bGUgPSAiRGlzdHJpYnVjacOzbiBkZSByYXRpbyBkZSBlbmRldWRhbWllbnRvIENQIGRlIE5PQydzIGUgWVBGIikrDQogIHlsaW0oTkEsIDEyLjUgKQ0KDQpnZ3Bsb3Qobm9jc19kZiAlPiUgZmlsdGVyKGNvbXBhbnkgPT0gIllQRiIpKSsNCiAgZ2VvbV9saW5lKCBhZXMoeWVhciwgcmF0aW9fZW5kZXVkYW1pZW50b19jcCwgZ3JvdXAgPSBjb21wYW55KSkrDQogIGxhYnModGl0bGUgPSAiUmF0aW8gZGUgZW5kZXVkYW1pZW50byBDUCBkZSBZUEYiKQ0KDQoNCmBgYA0KDQoNCmBgYHtyfQ0KZW5kZXVkYW1pZW50b19ncmFmIDwtIG5vY3NfZGYgJT4lIA0KICBmaWx0ZXIocmF0aW9fZW5kZXVkYW1pZW50byA8MTAgJiByYXRpb19lbmRldWRhbWllbnRvID4gLTMgKSAlPiUgDQogIGdncGxvdChhZXMoeWVhciwgcmF0aW9fZW5kZXVkYW1pZW50bywgY29sb3IgPSBjb21wYW55KSkrDQogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjUpKw0KICBsYWJzKHRpdGxlID0gICJSYXRpbyBkZSBlbmRldWRhbWllbnRvIHRvZGFzIGxhcyBlbXByZXNhcyIpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpKw0KICAjIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpKw0KICBmYWNldF93cmFwKH5wcm9kdWN0aW9uR3JvdXApDQpnZ3Bsb3RseShlbmRldWRhbWllbnRvX2dyYWYpDQpgYGANCmBgYHtyfQ0KZW5kZXVkYW1pZW50b19ncmFmX2FsIDwtIG5vY3NfZGYgJT4lIA0KICBmaWx0ZXIocmF0aW9fZW5kZXVkYW1pZW50byA8MzAgKSAlPiUNCiAgZmlsdGVyKGNvbXBhbnkgJWluJSBlbXByZXNhc19BTCRjb21wYW55ICkgJT4lIA0KICBnZ3Bsb3QoYWVzKHllYXIsIHJhdGlvX2VuZGV1ZGFtaWVudG8sIGNvbG9yID0gY29tcGFueSkpKw0KICBnZW9tX3BvaW50KGFscGhhID0gMC41KSsNCiAgbGFicyh0aXRsZSA9ICAiUmF0aW8gZGUgZW5kZXVkYW1pZW50byBlbXByZXNhcyBBTCIpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpKw0KICAjIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpKw0KICBmYWNldF93cmFwKH5wcm9kdWN0aW9uR3JvdXApDQpnZ3Bsb3RseShlbmRldWRhbWllbnRvX2dyYWZfYWwpDQpgYGANCg0KDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCmVuZGV1ZGFtaWVudG9fZmlsdHJvX2dyYWYgPC0gZmlsdHJvX2VtcF9kZiAlPiUgDQogICMgZmlsdGVyKHJhdGlvX3NvbHZlbmNpYSA+PTAgJiByYXRpb19zb2x2ZW5jaWEgPCA0KSAlPiUgDQogIGdncGxvdChhZXMoeWVhciwgcmF0aW9fZW5kZXVkYW1pZW50bywgY29sb3IgPSBjb21wYW55KSkrDQogIGdlb21fcG9pbnQoYWxwaGEgPSAxLCBzaXplID0gMykrDQogIGdlb21fbGluZSgpKw0KICBsYWJzKHRpdGxlID0gICJSYXRpbyBkZSBlbmRldWRhbWllbnRvIGVtcHJlc2FzIHNlbGVjY2lvbmFkYXMiKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iKQ0KICAjIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpKw0KDQplbmRldWRhbWllbnRvX2ZpbHRyb19ncmFmDQoNCg0KYGBgDQojIyMgVmFsb3JlcyBhYnNvbHV0b3MNCg0KYGBge3J9DQplbmRldWRhbWllbnRvX2FsbCA8LSBub2NzX2RmICU+JSANCiAgIyBmaWx0ZXIoY29tcGFueSAlaW4lIGVtcHJlc2FzX0FMJGNvbXBhbnkgKSAlPiUNCiAgZ2dwbG90KGFlcyh5ZWFyLCBsaWFiaWxpdGllcywgY29sb3IgPSBjb21wYW55KSkrDQogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjUpKw0KICBnZW9tX2xpbmUoKSsNCiAgbGFicyh0aXRsZSA9ICAiTGlhYmlsaXRpZXMiLCB5ID0gIlVTRCBtaWxsaW9uIikrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpKw0KICBmYWNldF93cmFwKH5wcm9kdWN0aW9uR3JvdXApDQogICMgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkrDQoNCmdncGxvdGx5KGVuZGV1ZGFtaWVudG9fYWxsKQ0KYGBgDQoNCg0KYGBge3J9DQplbmRldWRhbWllbnRvX2FsIDwtIG5vY3NfZGYgJT4lIA0KICBmaWx0ZXIoY29tcGFueSAlaW4lIGVtcHJlc2FzX0FMJGNvbXBhbnkgKSAlPiUNCiAgZ2dwbG90KGFlcyh5ZWFyLCBsaWFiaWxpdGllcywgY29sb3IgPSBjb21wYW55KSkrDQogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjUpKw0KICBnZW9tX2xpbmUoKSsNCiAgbGFicyh0aXRsZSA9ICAiTGlhYmlsaXRpZXMiLCB5ID0gIlVTRCBtaWxsaW9uIikrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpKw0KICBmYWNldF93cmFwKH5wcm9kdWN0aW9uR3JvdXApDQogICMgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkrDQoNCmdncGxvdGx5KGVuZGV1ZGFtaWVudG9fYWwpDQpgYGANCg0KYGBge3J9DQplbmRldWRhbWllbnRvIDwtIGZpbHRyb19lbXBfZGYgJT4lIA0KICBmaWx0ZXIoY29tcGFueSAhPSAiUmVzdG8iKSAlPiUNCiAgZ2dwbG90KGFlcyh5ZWFyLCBsaWFiaWxpdGllcywgY29sb3IgPSBjb21wYW55KSkrDQogIGdlb21fcG9pbnQoYWxwaGEgPSAxLCBzaXplID0gMykrDQogIGdlb21fbGluZSgpKw0KICBsYWJzKHRpdGxlID0gICJMaWFiaWxpdGllcyIsIHkgPSAiVVNEIG1pbGxpb24iKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iKQ0KICAjIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpKw0KDQplbmRldWRhbWllbnRvDQoNCmBgYA0KDQoNCg0KDQoNCmBgYHtyfQ0KIyB3cml0ZXhsOjp3cml0ZV94bHN4KGxpc3Qobm9jc19kYXRhID0gbm9jc19kZiAsDQojICAgICAgICAgICAgICAgICAgICAgICAgICB0Z19ub2NzPSB0Z19tZWRpYSksIHBhdGggPSAgIi9BcmNoaXZvcy9yZXBvcy9oaWRyb2NhcmJ1cm9zL2FuYWxpc2lzL3Jlc3VsdGFkb3MvYXJnZW50aW5hL05PQydzLnhsc3giKQ0KDQpgYGANCg0KI2NsdXN0ZXINCmBgYHtyfQ0KZGF0YV9jbHVzdGVyIDwtIG5vY3NfZnVsbCAlPiUgDQogIGZpbHRlcih5ZWFyID09IDIwMTEsIHVuaXRzID09ICJVU0QgbWlsbGlvbiIgKSAlPiUgDQogIHNlbGVjdChjb21wYW55LCBwcm9kdWN0aW9uR3JvdXAsIGluZGljYXRvck5hbWUsIG9ic2VydmF0aW9uKSAlPiUgDQogIG11dGF0ZShpZCA9IDE6bnJvdyguKSkgJT4lIA0KICBzcHJlYWQoa2V5ID0gaW5kaWNhdG9yTmFtZSwgdmFsdWU9b2JzZXJ2YXRpb24pICU+JQ0KICByZXBsYWNlKGlzLm5hKC4pLCAwICkNCiAgIyBuYS5vbWl0KCkNCg0KIyBkYXRhX2NsdXN0ZXJfeiA8LSBzY2FsZShkYXRhX2NsdXN0ZXJbNDpuY29sKGRhdGFfY2x1c3RlcildKQ0KDQpsaWJyYXJ5KGNsdXN0ZXIpDQpkYXRvc19wYXJhX2NsdXN0ZXIgPSBkYXRhX2NsdXN0ZXJbNDpuY29sKGRhdGFfY2x1c3RlcildDQoNCmNhbnRpZGFkX2NsdXN0ZXJzPTINCg0KQ0wgID0ga21lYW5zKHNjYWxlKGRhdG9zX3BhcmFfY2x1c3RlciksY2FudGlkYWRfY2x1c3RlcnMpDQpkYXRvcyRrbWVhbnMgPSBDTCRjbHVzdGVyDQpgYGANCg0K